#include "wireless.h"

/**
  *CSDN文章：（代码完美实现）stm32 + 新版 onenet + mqtt物联网(保姆级教程)
  *CSDN博主：送外卖的CV工程师
  *版权声明：本文件为博主原创代码，遵循 CC 4.0 BY-SA 版权协议，转载使用请附上原代码出处和本声明。
  *本文链接：https://blog.csdn.net/Wang2869902214/article/details/142501323
  *更新日期：2024-9-25
  *QQ群聊：STM连接onenet交流群983362248
  */

/*
	只需更新这些信息
*/

#define JsonEnable 0    //是否使用json组装数据，需要在启动文件中设置更大的堆内存


Wireless_TypeDef WirelessStatus = {0, 0, 0, 0};

#define WIFI_SSID "207"							//WIFI用户名

#define WIFI_PASSWORD "12345678"				//WIFI密码

#define ONENET_MQTT_PRODUCT_ID "YqRZ5hrM6p"		//OneNET MQTT产品ID

#define ONENET_MQTT_DEVICE_NAME "CSDN"			//OneNET MQTT设备名称

#define ONENET_MQTT_TOKEN "version=2018-10-31&res=products%2FYqRZ5hrM6p%2Fdevices%2FCSDN&et=2028715245&method=md5&sign=G4I0xqIYmYUtCdTTo2t%2FqQ%3D%3D"		//token

#define ONENET_MQTT_CMD_IDENTIFIER "cmd"			//OneNET MQTT命令标识符


const char *floatIdentifiers[] = {"temp", "bright"};			
float floatValues[] = {23.7, 55.6};
const char *stringIdentifiers[] = {0};		
const char *stringValues[] = {0};	

/*

			只需更新这些信息

*/
#define WIRELESS_WIFI_INFO "AT+CWJAP=\"" WIFI_SSID "\",\"" WIFI_PASSWORD "\"\r\n"
#define WIRELESS_RECEIVE_CMD "\"" ONENET_MQTT_CMD_IDENTIFIER "\":"

#define ONENET_MQTT_SERVER_INFO "AT+MQTTCONN=0,\"mqtts.heclouds.com\",1883,1\r\n"
#define ONENET_MQTT_USERCFG_INFO "AT+MQTTUSERCFG=0,1,\"" ONENET_MQTT_DEVICE_NAME "\",\"" ONENET_MQTT_PRODUCT_ID "\",\"" ONENET_MQTT_TOKEN "\",0,0,\"\"\r\n"
#define ONENET_MQTT_SET_TOPIC "AT+MQTTSUB=0,\"$sys/" ONENET_MQTT_PRODUCT_ID "/" ONENET_MQTT_DEVICE_NAME "/thing/property/set\",0\r\n"

#if JsonEnable
	#define ONENET_MQTT_SET_MQTTPUBRAW "AT+MQTTPUBRAW=0,\"$sys/" ONENET_MQTT_PRODUCT_ID "/" ONENET_MQTT_DEVICE_NAME "/thing/property/set_reply\""
	#define ONENET_MQTT_PUB_MQTTPUBRAW "AT+MQTTPUBRAW=0,\"$sys/" ONENET_MQTT_PRODUCT_ID "/" ONENET_MQTT_DEVICE_NAME "/thing/property/post\""
#else
	#define ONENET_MQTT_PUB_SET "AT+MQTTPUB=0,\"$sys/" ONENET_MQTT_PRODUCT_ID "/" ONENET_MQTT_DEVICE_NAME "/thing/property/set_reply\""
	#define ONENET_MQTT_PUBTOPIC "AT+MQTTPUB=0,\"$sys/" ONENET_MQTT_PRODUCT_ID "/" ONENET_MQTT_DEVICE_NAME "/thing/property/post\""
#endif



/**  
  * @简要  在无线模块初始化函数发送错误时执行
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
  * @参数  ErrorCode: 错误码，对应的错误状态  
  * @返回值 无  
  */
__weak void Wireless_Error_Handler(uint16_t ErrorCode)
{
	
}

/**  
  * @简要  用来适配无线模块发送字符的函数
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
  * @参数  cmd: 传入需要发送字符指针
  * @返回值 无  
  */
void Wireless_Usart_Send(char *cmd)
{
    if (cmd == NULL) return; // 确保指针不为空

    // 发送字符串
    // 参数依次为：USART句柄指针、发送数据缓冲区指针、数据字节长度
	HAL_UART_Transmit_DMA(&huart2, (uint8_t *)cmd, strlen(cmd));
}


/**  
  * @简要  清除无线模块接收数组缓存
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
  * @参数  无
  * @返回值 无  
  */
void Wireless_Buffer_Clear(void)
{
	memset(WirelessRx.RxBuffer, 0, sizeof(WirelessRx.RxBuffer));
	WirelessRx.RxDataCnt = 0;
}


/**  
  * @简要  无线模块发送指令并且等待回应数据
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
  * @参数  cmd：需要发送的指令字符串地址
  * @参数  res：需要回应的指令
  * @参数  sendCount：最大发送指令次数
  * @返回值 无  
  */
uint8_t Wireless_Send_Command(char *cmd, char *res, uint8_t sendCount)
{
	uint8_t status = 1;
	while(sendCount--)
	{
		Wireless_Usart_Send(cmd);
		//printf("cmd :%s",cmd);

		if(WirelessStatus.receiveDataFlag == 1)
		{
			if(strstr((const char *)WirelessRx.RxBuffer, res) != NULL)		//若找到关键字
			{		
				status = 0;
				WirelessStatus.receiveDataFlag = 0;
				Wireless_Buffer_Clear();
				break;
			}
			Wireless_Buffer_Clear();
			WirelessStatus.receiveDataFlag = 0;
		}
		HAL_Delay(300);
	}
	return status;
}

/**  
  * @简要  无线模块初始化函数
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
  * @参数  无
  * @注意事项 	如果函数初始化失败，会进入错误函数
  * @返回值 无  
  */
void Wireless_Init(void)
{
	const uint8_t sendDataCount = 10;
    printf("\r\nStart MQTT service\r\n");

	printf("1. AT+RST\r\n");    										//需要延迟最少500ms，否则下一句指令发送无效
	if(Wireless_Send_Command("AT+RST\r\n", "", sendDataCount) == 1) 		WirelessStatus.wirelessInitErrorCode |= 1 << 0;
	HAL_Delay(500);
	
	printf("2. ATE0\r\n");												//关闭回显
	if(Wireless_Send_Command("ATE0\r\n", "OK", sendDataCount) == 1)				WirelessStatus.wirelessInitErrorCode |= 1 << 1;
	HAL_Delay(100);
	
	printf("3. AT+CWAUTOCONN=0\r\n");									//上电不自动连接 AP
	if(Wireless_Send_Command("AT+CWAUTOCONN=0\r\n", "OK", sendDataCount) == 1) 	WirelessStatus.wirelessInitErrorCode |= 1 << 2;
	HAL_Delay(100);
	
	printf("4. AT+CWMODE=1\r\n");										//设置 Station 模式
	if(Wireless_Send_Command("AT+CWMODE=1\r\n", "OK", sendDataCount) == 1)		WirelessStatus.wirelessInitErrorCode |= 1 << 3;
	HAL_Delay(100);
	
	printf("5. AT+CWDHCP=1,0\r\n");										//启用DHCP
	if(Wireless_Send_Command("AT+CWDHCP=1,0\r\n", "OK", sendDataCount) == 1)	WirelessStatus.wirelessInitErrorCode |= 1 << 4;
	HAL_Delay(100);
	
	printf("6. AT+CWJAP=\"%s\",\"%s\"\r\n", WIFI_SSID, WIFI_PASSWORD);			//连接AP
	if(Wireless_Send_Command(WIRELESS_WIFI_INFO, "GOT IP", 8) == 1) 			WirelessStatus.wirelessInitErrorCode |= 1 << 5;
	HAL_Delay(100);

	printf("7. ESP8266_USERCFG_INFO=%s\r\n", ONENET_MQTT_USERCFG_INFO); 		//设置 MQTT 用户属性
	if(Wireless_Send_Command(ONENET_MQTT_USERCFG_INFO, "OK", sendDataCount) == 1)	WirelessStatus.wirelessInitErrorCode |= 1 << 6;
	HAL_Delay(100);
	
	printf("8. ESP8266_ONENET_INFO=%s\r\n",ONENET_MQTT_SERVER_INFO);   				//连接 MQTT Broker
	if(Wireless_Send_Command(ONENET_MQTT_SERVER_INFO, "OK", sendDataCount) == 1) 				WirelessStatus.wirelessInitErrorCode |= 1 << 7;
	HAL_Delay(100);
	
	printf("9. SET_TOPIC=%s\r\n",ONENET_MQTT_SET_TOPIC);							//设置 MQTT 用户属性
	if(Wireless_Send_Command(ONENET_MQTT_SET_TOPIC, "OK", sendDataCount) == 1) 				WirelessStatus.wirelessInitErrorCode |= 1 << 8;
	HAL_Delay(100);

	if(WirelessStatus.wirelessInitErrorCode == 0) 
	{
		WirelessStatus.wirelessInitFlag = 1;
		printf("MQTT service started successfully!!!\r\n\r\n\r\n");
	}
	else 
	{
		WirelessStatus.wirelessInitFlag = 0;
		printf("MQTT service failed to start,ERROR CODE:%X\r\n\r\n\r\n", WirelessStatus.wirelessInitErrorCode);
		Wireless_Error_Handler(WirelessStatus.wirelessInitErrorCode);  //错误处理函数
	}
		
}

/**  
  * @简要  为了无线模块接收数据时符合json格式，去掉末尾的\r\n
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
  * @参数  str：接收的数据字符串地址
  * @返回值 无  
  */
void Remove_Trailing_Crlf(char *str) {  
    size_t len = strlen(str);  
      
    // 检查末尾字符是否为\r\n  
    if (len >= 2 && str[len - 1] == '\n' && str[len - 2] == '\r') {  
        // 移除\r\n  
        str[len - 2] = '\0';
    }
}

/**  
  * @简要  提取无线模块接收的json格式数据内容
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
  * @参数  json_data：接收的json格式数据字符串地址
  * @参数  id：获取解析后"id"的值
  * @参数  command：获取解析后"command"的值
  * @注意事项	如果需要添加提取的内容，需要修改函数参数，以及添加函数中json的对象
  * @返回值 无  
  */
void Wireless_Extract_Receive_Command(const char *json_data, char *id, int *command) {  
    json_error_t error;  
    json_t *root = json_loads(json_data, strlen(json_data), &error);  // 解析JSON字符串  
	
    if (!root) {  
        // 解析失败，输出错误信息  
        fprintf(stderr, "Error parsing JSON: %s\r\n", error.text);  
		printf("Error String:%s",json_data);
        return;  
    }  
  
    // 提取id的值  
    json_t *id_value = json_object_get(root, "id");  
    if (json_is_string(id_value)) {  
		//id = (char *)json_string_value(id_value);
		strcpy(id, (char *)json_string_value(id_value));
        printf("id: \"%s\"\r\n", id);  
    } else {  
        printf("id is not a string\r\n");  
    }  
    // 提取command的值  
    json_t *params = json_object_get(root, "params");  
    if (json_is_object(params)) {  
        json_t *command_value = json_object_get(params, ONENET_MQTT_CMD_IDENTIFIER);  
        if (json_is_integer(command_value)) {  
			*command = (int)json_integer_value(command_value);
            printf("%s: %d\r\n",ONENET_MQTT_CMD_IDENTIFIER, *command);  
        } else {  
            printf("%s is not an integer\r\n",ONENET_MQTT_CMD_IDENTIFIER);  
        }  
    } else {  
        printf("params is not an object\r\n");  
    }  
    // 释放JSON对象  
    json_decref(root);  
}  



#if JsonEnable

	/**  
	  * @简要  无线模块接收到下发的数据后，提取id值，组装指令
      * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
	  * @参数  AckString：需要组装的字符串地址
	  * @参数  id：获取解析后"id"的值
	  * @注意事项	代码逻辑决定这里的指令回应不能重复，最多发一次
	  * @返回值 无  
	  */
	void Wireless_Receive_Ack_CloudPlatform(char *AckString, char *id) {  
		int code = 200; // 动态参数  
		const char *msg = "success"; // 动态参数  
	  
		// 使用jansson库创建JSON对象  
		json_t *json_root = json_object();  
		if (!json_root) {  
			fprintf(stderr, "Failed to create JSON root object\n");  
			return;  
		}  
	  
		// 向JSON对象中添加键值对  
		json_object_set_new(json_root, "id", json_string(id));  
		json_object_set_new(json_root, "code", json_integer(code));  
		json_object_set_new(json_root, "msg", json_string(msg));  
	  
		// 将JSON对象格式化为字符串  
		char *json_dump = json_dumps(json_root, JSON_ENCODE_ANY);  
		if (!json_dump) {  
			fprintf(stderr, "Failed to dump JSON to string\n");  
			json_decref(json_root);  // 记得在失败时释放JSON对象  
			return;  
		}  
		
		snprintf(AckString, 256, "%s,%d,0,0\r\n", ONENET_MQTT_SET_MQTTPUBRAW, strlen(json_dump) + 2);  //添加\r\n的长度
		
		//printf("AckString = %s",AckString);
		//Wireless_Usart_Send(AckString);
		Wireless_Send_Command(AckString,"OK",1);
		strcat(json_dump, "\r\n");
		printf("%s", json_dump);
		Wireless_Send_Command(json_dump,"+MQTTPUB:OK",1);
		
		// 释放jansson库分配的内存  
		free(json_dump);  
		json_decref(json_root);  
	}  


	/**  
	  * @简要  无线模块上报数据	
	  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
	  * @参数  floatCount：	需要发送的float数据个数
	  * @参数  *floatIdentifiers[]：float标识符数组
	  * @参数  floatValues[]：float数据数组
	  * @参数  stringCount：需要发送的string数据个数
	  * @参数  *stringIdentifiers[]：string标识符数组
	  * @参数  const char *stringValues[]：string数据数组
	  * @注意事项	这里使用json组装，需要动态分配大量的内容，需要将堆大小设置最小0x600
	  * @返回值 无  
	  */
	void Wireless_Publish_Data(unsigned char floatCount, const char *floatIdentifiers[], float floatValues[], unsigned char stringCount, const char *stringIdentifiers[], const char *stringValues[]) {  
		json_t *root, *id_obj, *version_obj, *params_obj;  
		char *json_str;  
		size_t json_str_len;  
	  
		// 创建JSON对象  
		root = json_object();  
		id_obj = json_string("123");  
		version_obj = json_string("1.0");  
		params_obj = json_object();  
	  
		// 添加id和version到root对象  
		json_object_set_new(root, "id", id_obj);  
		json_object_set_new(root, "version", version_obj);  
		  
		// 添加浮点数数据到params对象  
		for (unsigned char i = 0; i < floatCount; ++i) {  
			json_t *float_val_obj = json_object();  
			json_object_set_new(float_val_obj, "value", json_real(floatValues[i]));  
			json_object_set_new(params_obj, floatIdentifiers[i], float_val_obj);  
		}  
	  
		// 添加字符串数据到params对象  
		for (unsigned char i = 0; i < stringCount; ++i) {  
			json_t *string_val_obj = json_object();  
			json_object_set_new(string_val_obj, "value", json_string(stringValues[i]));  
			json_object_set_new(params_obj, stringIdentifiers[i], string_val_obj);  
		}  
	  
		// 将params对象添加到root对象  
		json_object_set_new(root, "params", params_obj);  
	  
		// 将JSON对象转换为字符串  
		json_str = json_dumps(root, JSON_INDENT(0) | JSON_REAL_PRECISION(4));  
		json_str_len = strlen(json_str);  
	  
		// printf("json_str = %s\r\n",json_str);
		
		// 为MQTT发布准备最终的消息字符串  
		char globalBuffer[256];  // 确保缓冲区足够大  
		snprintf(globalBuffer, sizeof(globalBuffer), "%s,%d,0,0\r\n", ONENET_MQTT_PUB_MQTTPUBRAW, json_str_len + 2);  //添加\r\n的长度
		
		// 发送命令  
		Wireless_Send_Command(globalBuffer, "OK", 1);  
		strcat(json_str, "\r\n");
		printf("%s%s",globalBuffer, json_str);
		Wireless_Send_Command(json_str, "+MQTTPUB:OK", 1);  
		// 释放JSON对象  
		json_decref(root);  
		free(json_str);  // 注意：json_dumps分配的内存需要手动释放  
	}  

#else
	/**  
	  * @简要  无线模块接收到下发的数据后，提取id值，组装指令
	  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
	  * @参数  AckString：需要组装的字符串地址
	  * @参数  id：获取解析后"id"的值
	  * @注意事项	这里需要二重转义：第一次转义字符是软件上字符串要求格式，第二次是因为AT指令发送字符串，
					需要再转义一次，故不方便使用json组装数据
	  * @返回值 无  
	  */

	void Wireless_Receive_Ack_CloudPlatform(char *AckString, char *id)
	{
		int code = 200; // 动态参数  
		char *msg = "success"; // 动态参数
		char json_data[64];  // 假设64字节足够存储嵌套的JSON数据
		// 构建嵌套的JSON字符串  
		snprintf(json_data, sizeof(json_data),  
				 "{\\\"id\\\":\\\"%s\\\"\\,\\\"code\\\":\\%d\\,\\\"msg\\\":\\\"%s\\\"}",  
				 id, code, msg); 
		
			// 构建AT指令字符串  
		snprintf(AckString, 128,  
				 "%s,\"%s\",0,0\r\n",
				ONENET_MQTT_PUB_SET,json_data);
		Wireless_Send_Command(AckString,"OK",2);
		
	}

	/**  
	  * @简要  无线模块上报数据	
	  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
	  * @参数  floatCount：	需要发送的float数据个数
	  * @参数  *floatIdentifiers[]：float标识符数组
	  * @参数  floatValues[]：float数据数组
	  * @参数  stringCount：需要发送的string数据个数
	  * @参数  *stringIdentifiers[]：string标识符数组
	  * @参数  const char *stringValues[]：string数据数组
	  * @注意事项	这里需要二重转义：第一次转义字符是软件上字符串要求格式，第二次是因为AT指令发送字符串，
					需要再转义一次，故不方便使用json组装数据
	  * @返回值 无  
	  */
	void Wireless_Publish_Data(unsigned char floatCount, const char *floatIdentifiers[], float floatValues[], unsigned char stringCount, const char *stringIdentifiers[], const char *stringValues[]) 
	{  
		// 初始化缓冲区位置  
		size_t bufferPos = 0;  
		const uint8_t BUFFER_SIZE = 255;
		char globalBuffer[BUFFER_SIZE];
		// 拼接主题和JSON开头  
		bufferPos += snprintf(globalBuffer + bufferPos, BUFFER_SIZE - bufferPos, "%s,\"{\\\"id\\\":\\\"123\\\"\\,\\\"params\\\":{", ONENET_MQTT_PUBTOPIC);  
		  
		// 处理浮点数数据  
		for (unsigned char i = 0; i < floatCount; ++i) {  
			bufferPos += snprintf(globalBuffer + bufferPos, BUFFER_SIZE - bufferPos,  
								  "\\\"%s\\\":{\\\"value\\\":%.2f\\}%s",  
								  floatIdentifiers[i], floatValues[i],  
								  (i < floatCount - 1 || stringCount > 0) ? "\\," : "");  
		}  
		  
		// 处理字符串数据  
		for (unsigned char i = 0; i < stringCount; ++i) {  
			bufferPos += snprintf(globalBuffer + bufferPos, BUFFER_SIZE - bufferPos,  
								  "\\\"%s\\\":{\\\"value\\\":\\\"%s\\\"\\}%s",  
								  stringIdentifiers[i], stringValues[i],  
								  (i < stringCount - 1) ? "\\," : "");  
		}  
		  
		// 拼接JSON结尾  
		bufferPos += snprintf(globalBuffer + bufferPos, BUFFER_SIZE - bufferPos, "}}\",0,0\r\n");  
		  
		// 确保我们没有超出缓冲区  
		if (bufferPos >= BUFFER_SIZE) {  
			// 处理错误，例如通过日志记录  
			return;  
		}  
		//printf("%s",globalBuffer);
		Wireless_Send_Command(globalBuffer,"OK",1);
	}
#endif





/**  
  * @简要  执行无线模块接收到下发指令对应的操作
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 	
  * @参数  cmdValue：提取后的指令数据
  * @注意事项	这里的指令可以更改为比int更大类型，需要在提取Wireless_Extract_Receive_Command函数中修改提取的数据大小
  * @返回值 无  
  */
void Wireless_Receive_Command_Control(int cmdValue)
{
	//1000 1 0 ：1000灯 2 代表2号灯 0代表灭 
	if(cmdValue == 10021)  	 HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin,GPIO_PIN_SET);
	else if(cmdValue == 10020)  HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin,GPIO_PIN_RESET); 
	
	if(cmdValue == 10031)  	 HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin,GPIO_PIN_SET);
	else if(cmdValue == 10030)  HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin,GPIO_PIN_RESET); 
}



/**  
  * @简要  无线模块接收到下发的数据后进行回应	
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
  * @参数  str：无线模块接收到的数据
  * @注意事项	这里判断下发的指令中是否包含关键字： "+MQTTSUBRECV"
				里面的printf可以打印接收到的数据和转换后的数据
  * @返回值 无  
  */
void Wireless_Receive_Command_Respond(const char * str)
{
	char *jsonData;
	char id[5] = {0};
	int command = 0;
		
	if(strstr(str, "+MQTTSUBRECV") != NULL)			//利用AT指令的特性去判断接受的内容是否包含关键字以验证数据来源
	  {

			//printf("str = %s",str);						//【调试】
			jsonData = strchr((const char*)str, '{');		//提取json格式数据，通常是以 “{”开始    以“}”结尾
			//printf("jsonData = %s",jsonData);				//【调试】
			Remove_Trailing_Crlf(jsonData);					//这里需要去除末尾的换行回车符
			Wireless_Extract_Receive_Command(jsonData, id, &command);	//这里使用keil.Jansson去提取下发数据的id和command
			Wireless_Receive_Ack_CloudPlatform((char *)str, id);		//这里回应OneNET，表示接收到了数据
			Wireless_Receive_Command_Control(command);		//这里对接收到的command执行对应的操作
			
			
	  }
}

/**  
  * @简要  无线模块运行函数	
  * @作者 [CSDN：送外卖的CV工程师，博客地址：https://blog.csdn.net/Wang2869902214/article/details/142501323] 
  * @参数  无
  * @注意事项	一直轮询，可以设置为定时触发，但是回应下发的数据会变慢
  * @返回值 无  
  */
void Wireless_Loop(void)
{
	if(WirelessStatus.receiveDataFlag == 1)
	{
		WirelessStatus.receiveDataFlag = 0;	//清除接收数据标志位
		Wireless_Receive_Command_Respond((char *)WirelessRx.RxBuffer);		//接收到指令后进行回应操作
		Wireless_Buffer_Clear();     //执行完接收数据的所有操作后再清除缓存
	}
	else if(WirelessStatus.sendDataFlag == 1 && WirelessStatus.wirelessInitFlag == 1) 
	{
		WirelessStatus.sendDataFlag = 0;		//清除发送数据标志位
		Wireless_Publish_Data(2, floatIdentifiers, floatValues, 0, stringIdentifiers, stringValues);	//上报数据
	}
}
